const errTxt = {
    10000: '参数错误,或商品不符合行业要求',
    10401: '请求异常，可重试或升级APP',
    11004: '签名异常',
    11001: '访问未授权',
    12002: '账号行为异常',
    13000: '系统错误',
    21016: '外部单号已存在',
    21046: '订单收款商户号不合法',
    21550: '请用真机调试或者参考常见问题',
    26003: '小程序违规，支付能力被封禁',
    26005: '无可用支付方式',
    26006: '商户号与小程序的支付产品不一致',
    21538: '传参错误',
}
const errTxtBill = {
    10000: '参数错误',
    10401: '请求异常，可重试或升级APP',
    11001: '访问未授权',
    12002: '账号行为异常',
    13000: '系统错误',
    20000: '订单不存在',
    21012: '创建订单失败，请稍后重试',
    21046: '订单收款商户号不合法',
    21550: '请用真机调试或者参考常见问题',
    26001: '当前订单状态不可支付',
    26003: '小程序违规，支付能力被封禁',
    26005: '无可用支付方式',
    26006: '商户号与小程序的支付产品不一致',
    1: '支付超时',
    2: '支付失败',
    3: '支付关闭',
    4: '支付取消',
    9: '建议开发者自行通过服务端的订单查询接口获取订单状态',
}


// 预下单
export function ttpay(data) {
    console.log('requestOrder', tt.canIUse('requestOrder'))
    if (!tt.canIUse('requestOrder')) return tt.showToast({ title: 'api错误，或使用真机环境', icon: 'none' });
    return new Promise((r, j) => {
        tt.requestOrder({
            ...data,
            success: async ({ orderId, itemOrderList, logId }) => {
                console.log('抖音orderid', orderId);
                const isPay = await settlement(orderId)
                r({ status: true, orderId, isPay })
            },
            fail: ({ errNo, errMsg }) => {
                console.log('requestOrder', errNo, errMsg)

                tt.showToast({ title: errTxt[errNo], icon: 'none' });
                j({ status: false, orderId: '' })
            },
        });
    })
}

// 拉起收银台结账
function settlement(orderId) {
    if (!tt.canIUse('getOrderPayment')) return tt.showToast({ title: 'api错误，或使用真机环境', icon: 'none' });
    return new Promise((r, j) => {
        tt.getOrderPayment({
            orderId,
            success: ({ orderId }) => {
                r(true)
            },
            fail: ({ errNo, errMsg }) => {
                console.log('getOrderPayment', errNo, errMsg)

                tt.showToast({ title: errTxtBill[errNo], icon: 'none' });
                r(false)
            }
        })
    })
}

export async function retry(fn, times = 1, sleep = 50) {
    --times;
    try {
        return await Promise.resolve(fn());
    } catch (e) {
        if (!times) throw e;
        if (sleep) {
            return new Promise((r, j) => {
                setTimeout(async function () {
                    try {
                        const res = await retry(fn, times, sleep)
                        r(res)
                    } catch {
                        j()
                    }
                }, sleep);
            })
        }
    }
}

